const db = require('../db/db')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const config = require('../config')

//初始化路由函数
//注册
exports.reguser = (req, res) => {
    // 1. 检测表单数据是否合法
    const userinfo = req.body;
    // if (!userinfo.username || !userinfo.password) return res.cc("用户名或密码不能为空! ")
    // 2. 检测用户名是否被占用`
    db.query("select * from ev_users where username = ?", userinfo.username, (err, result) => {
        if (err) return res.cc(err)
        if (result != 0) return res.cc("用户名已被占用,请更换用户名! ")
        // 3. 对密码进行加密处理
        const password = bcrypt.hashSync(userinfo.password, 10)
        // 4. 插入新用户
        db.query("insert into ev_users set ?", { username: userinfo.username, password: password }, (err, result) => {
            //sql语句报错
            if (err) return res.cc(err)
            //判断数据是否插入
            if (result.affectedRows !== 1) return res.cc("注册失败! ")
            res.cc("注册成功! ", 0);
        })
    })

}
//登录路由
exports.login = (req, res) => {
    // 1. 检测表单数据是否合法
    // 2. 根据用户名查询用户的数据
    // 3. 判断用户输入的密码是否正确
    // 4. 生成 JWT 的 Token 字符串
    const userinfo = req.body;
    const sqlStr = "select * from ev_users where username = ?"
    db.query(sqlStr, userinfo.username, (err, result) => {
        //判断sql语句是否正确
        if (err) return res.cc(err)
        //判断数据库中是否查询到数据
        if (result.length === 0) return res.cc("用户名或密码错误! ")
        //当查询到用户名后,再判断密码是否正确.
        if (!bcrypt.compareSync(userinfo.password, result[0].password)) return res.cc("用户名或密码错误! ")
        //当密码正确后,就开始生成token,在生成token时,记住需要将password和user_pic剔除,第一是密码是私有的,第二是base64字符太长了.
        const user = { ...result[0], password: "", user_pic: "" }
        //生成token字符串
        const token = jwt.sign(user, config.jwtSecretKey, { expiresIn: "10h" })

        res.send({
            status: 0,
            message: "登录成功! ",
            token: "Bearer " + token,
        })
    })
}